/*************************************************************************
*                              起源太空
*
*------------------------------------------------------------------------
* 文件名：       	uart_lite.c
* 使用说明：          本文件用于pl的422通信
*------------------------------------------------------------------------
* 日期： 		2022.10.27
* 版本： 		V0.0
* 修改人：		张海峰
* 修改内容：  	创建
*------------------------------------------------------------------------
* 					修改 / 更新记录
*------------------------------------------------------------------------
* 日期： 		xxxx.xx.xx
* 版本： 		V0.1
* 修改人：		XXX
* 修改内容：	1.添加了XXX XXX 功能
*            	2.修改了XXX XXX 的错误
*------------------------------------------------------------------------
* 日期： 		xxxx.xx.xx
* 版本： 		V0.2
* 修改人：		XXX
* 修改内容：	1.添加了XXX XXX 功能
*            	2.修改了XXX XXX 的错误
*************************************************************************/


/*************************************************************************
*                               头文件
*************************************************************************/
#include "xcanps.h"
#include "dri_hal_uart_lite.h"
#include "camera_process.h"


/*************************************************************************
*                           全局变量 \ 引用
*************************************************************************/



/*************************************************************************
*                           本地变量 \ 引用
*************************************************************************/
#define COUNTS_PER_USECOND  (XPAR_CPU_CORTEXA53_CORE_CLOCK_FREQ_HZ / (2U*1000000U))

static u8 RecvBuffer_1[RECV_BUFFER_SIZE];
static u8 RecvBuffer_2[RECV_BUFFER_SIZE];
static unsigned int TotalSentCount;

static void UartLite0RecvHandler(void *CallBackRef, unsigned int EventData);
static void UartLite0SendHandler(void *CallBackRef, unsigned int EventData);
static void UartLite1RecvHandler(void *CallBackRef, unsigned int EventData);
static void UartLite1SendHandler(void *CallBackRef, unsigned int EventData);
static int UartLiteSetupIntrSystem(XScuGic *IntcInstancePtr,
		XUartLite *UartLiteInstPtr, u16 UartLiteIntrId);

/*************************************************************************
*                              函数原型
*************************************************************************/

/*************************************************************************
* 函数名称：	UartLiteIntrInit
* 功能：		初始化pl的422端口
**************************************************************************
* 输入变量：
* 			IntcInstancePtr,		系统中断设备指针
* 			UartLiteInstPtr,		422设备指针
* 			UartLiteDeviceId, 		422设备号
* 			UartLiteIntrId			422设备中断号
* 输出变量：		无
* 返回值：		iStatus:
* 				XST_SUCCESS		0		成功
* 				XST_FAILURE		1		失败
*-------------------------------------------------------------------------
* 日期          		修改人       		 修改内容
*-------------------------------------------------------------------------
* 2022.10.27           张海峰          		创建
* xxxx.xx.xx    XXX          添加/修改了XXXXXXXXXXX
*************************************************************************/
int UartLiteIntrInit(XScuGic *IntcInstancePtr, XUartLite *UartLiteInstPtr,
						u16 UartLiteDeviceId, u16 UartLiteIntrId)
{
	int iStatus;

	/* 初始化422驱动  */
	iStatus = XUartLite_Initialize(UartLiteInstPtr, UartLiteDeviceId);
	if (iStatus != XST_SUCCESS)
	{
		return XST_FAILURE;
	}

	/* 检测硬件设备 */
	iStatus = XUartLite_SelfTest(UartLiteInstPtr);
	if (iStatus != XST_SUCCESS)
	{
		return XST_FAILURE;
	}

	/* 配置系统中断  */
	iStatus = UartLiteSetupIntrSystem(IntcInstancePtr,
					 UartLiteInstPtr,
					 UartLiteIntrId);
	if (iStatus != XST_SUCCESS) {
		return XST_FAILURE;
	}

	/* 设置uart的中断处理函数  */
	if(UartLiteInstPtr == &UartLiteInst0)
	{
		XUartLite_SetSendHandler(UartLiteInstPtr, UartLite0SendHandler,
								 UartLiteInstPtr);
		XUartLite_SetRecvHandler(UartLiteInstPtr, UartLite0RecvHandler,
								 UartLiteInstPtr);
	}
	else if(UartLiteInstPtr == &UartLiteInst1)
	{

		XUartLite_SetSendHandler(UartLiteInstPtr, UartLite1SendHandler,
								 UartLiteInstPtr);
		XUartLite_SetRecvHandler(UartLiteInstPtr, UartLite1RecvHandler,
								 UartLiteInstPtr);

	}

	/* 使能中断  */
	XUartLite_EnableInterrupt(UartLiteInstPtr);

	if(UartLiteInstPtr == &UartLiteInst0)
	{
		XUartLite_Recv(UartLiteInstPtr, RecvBuffer_1, RECV_BUFFER_SIZE);
	}
	else if(UartLiteInstPtr == &UartLiteInst1)
	{
		XUartLite_Recv(UartLiteInstPtr, RecvBuffer_2, RECV_BUFFER_SIZE);
	}


	return XST_SUCCESS;
}


/*************************************************************************
* 函数名称：	UartLiteSetupIntrSystem
* 功能：		配置pl的422端口中断
**************************************************************************
* 输入变量：
* 			IntcInstancePtr,		系统中断设备指针
* 			UartLiteInstPtr, 		422设备的指针
* 			UartLiteIntrId			422设备的中断号
* 输出变量：		无
* 返回值：		iStatus:
* 				XST_SUCCESS		0		成功
* 				XST_FAILURE		1		失败
*-------------------------------------------------------------------------
* 日期          		修改人       		 修改内容
*-------------------------------------------------------------------------
* 2022.10.27           张海峰          		创建
* xxxx.xx.xx    XXX          添加/修改了XXXXXXXXXXX
*************************************************************************/
static int UartLiteSetupIntrSystem(XScuGic *IntcInstancePtr,
				XUartLite *UartLiteInstPtr, u16 UartLiteIntrId)
{
	int iStatus;

	/* 系统中断寄存器指针  */
	XScuGic_Config *IntcConfig;

	/* 初始化系统中断驱动  */
	IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
	if (NULL == IntcConfig)
	{
		return XST_FAILURE;
	}

	/* 配置422的中断处理函数  */
	iStatus = XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig,
					IntcConfig->CpuBaseAddress);
	if (iStatus != XST_SUCCESS)
	{
		return XST_FAILURE;
	}

	XScuGic_SetPriorityTriggerType(IntcInstancePtr, UartLiteIntrId,
					0x0, 0x3);

	/* 设置中断处理函数  */
	iStatus = XScuGic_Connect(IntcInstancePtr, UartLiteIntrId,
				 (Xil_ExceptionHandler)XUartLite_InterruptHandler,
				 UartLiteInstPtr);
	if (iStatus != XST_SUCCESS)
	{
		return iStatus;
	}

	/* 使能中断  */
	XScuGic_Enable(IntcInstancePtr, UartLiteIntrId);
	Xil_ExceptionInit();
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
			(Xil_ExceptionHandler)INTC_HANDLER,
			IntcInstancePtr);

	Xil_ExceptionEnable();



	return XST_SUCCESS;
}

/*************************************************************************
* 函数名称：	UartLite0SendHandler
* 功能：		pl的422端口0的发送数据处理
**************************************************************************
* 输入变量：		无
* 输出变量：		CallBackRef,		回调函数指针
* 				EventData, 			事件发生的字节数
* 返回值：			无
*-------------------------------------------------------------------------
* 日期          		修改人       		 修改内容
*-------------------------------------------------------------------------
* 2022.10.27           张海峰          		创建
* xxxx.xx.xx    XXX          添加/修改了XXXXXXXXXXX
*************************************************************************/
static void UartLite0SendHandler(void *CallBackRef, unsigned int EventData)
{
	TotalSentCount = EventData;
#if 0
	XTime_GetTime(&tCur);
#endif
#if 0
	XTime_GetTime(&tEnd);
#endif
}


static void UartLite1SendHandler(void *CallBackRef, unsigned int EventData)
{
	TotalSentCount = EventData;
#if 0
	XTime_GetTime(&tCur);
#endif

#if 0
	XTime_GetTime(&tEnd);

#endif
}

/*************************************************************************
* 函数名称：	UartLite0RecvHandler
* 功能：		pl的422端口0的接收数据处理
**************************************************************************
* 输入变量：		无
* 输出变量：		CallBackRef,		回调函数指针
* 				EventData, 			事件发生的字节数
* 返回值：			无
*-------------------------------------------------------------------------
* 日期          		修改人       		 修改内容
*-------------------------------------------------------------------------
* 2022.10.27           张海峰          		创建
* xxxx.xx.xx    XXX          添加/修改了XXXXXXXXXXX
*************************************************************************/
static void UartLite0RecvHandler(void *CallBackRef, unsigned int EventData)
{

    CameraCommandRecv(1, RecvBuffer_1);

    memset(RecvBuffer_1, 0, sizeof(RecvBuffer_1));
    XUartLite_ResetFifos(CallBackRef);
    XUartLite_Recv(CallBackRef, RecvBuffer_1, RECV_BUFFER_SIZE);
}

static void UartLite1RecvHandler(void *CallBackRef, unsigned int EventData)
{

	//XUartLite_Recv(CallBackRef,RecvBuffer,RECV_BUFFER_SIZE);

    CameraCommandRecv(2, RecvBuffer_2);

    memset(RecvBuffer_2, 0, sizeof(RecvBuffer_2));
    XUartLite_ResetFifos(CallBackRef);
    XUartLite_Recv(CallBackRef, RecvBuffer_2, RECV_BUFFER_SIZE);
}

